package org.wk.account.service;

import com.google.common.base.Strings;
import org.joda.time.DateTime;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.wk.account.dao.SubAccountDao;
import org.wk.account.dao.yuan.SubAccountYuanDao;
import org.wk.account.dao.yuan.SubAccountYuanSeqDao;
import org.wk.account.dao.yuan.SubAccountYuanToZaiBillDao;
import org.wk.account.dao.zai.SubAccountZaiDao;
import org.wk.account.dao.zai.SubAccountZaiFromYuanBillDao;
import org.wk.account.dao.zai.SubAccountZaiSeqDao;
import org.wk.account.domain.SubAccount;
import org.wk.account.domain.yuan.SubAccountYuan;
import org.wk.account.domain.yuan.SubAccountYuanSeq;
import org.wk.account.domain.yuan.SubAccountYuanToZaiBill;
import org.wk.account.domain.zai.SubAccountZai;
import org.wk.account.domain.zai.SubAccountZaiFromYuanBill;
import org.wk.account.domain.zai.SubAccountZaiSeq;
import org.wk.account.enums.*;
import org.wk.account.view.ConfigVo;
import org.wk.core.common.view.ResponseVo;
import org.wk.core.db.tool.WebUtils;

import java.math.BigDecimal;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/**
 * 鲸源释放鲸仔操作
 */
@Service
public class ReleaseYuanServiceImpl implements ReleaseYuanService {

    private final Logger logger = LoggerFactory.getLogger(this.getClass());

    @Autowired
    private SubAccountDao subAccountDao;

    @Autowired
    private SubAccountYuanDao subAccountYuanDao;
    @Autowired
    private SubAccountYuanSeqDao subAccountYuanSeqDao;
    @Autowired
    private SubAccountYuanToZaiBillDao subAccountYuanToZaiBillDao;

    @Autowired
    private SubAccountZaiDao subAccountZaiDao;
    @Autowired
    private SubAccountZaiSeqDao subAccountZaiSeqDao;
    @Autowired
    private SubAccountZaiFromYuanBillDao subAccountZaiFromYuanBillDao;



    @Autowired
    private ConfigService configService;

    /**
     * 获取鲸源释放鲸仔状态
     * 查看用户是否拥有鲸源，查看用户当天是否已经领取过鲸源
     *
     * @return  true 已领取  false 未领取
     */
    @Override
    public ResponseVo selectReleaseYuan() {
        String userId=WebUtils.getUser().getId();

        Map<String,Object> resData = new HashMap<>(2);
        //默认已经领取过
        resData.put("release_status",true);
        resData.put("release_num",0);
        String currentDay = new DateTime().toString("yyyy-MM-dd");
        //查询是否已经领取过
        SubAccountYuanToZaiBill subAccountYuanToZaiBill = subAccountYuanToZaiBillDao.findByUserIdAndCurrentDay(userId,currentDay);
        //没有领取记录
        if (subAccountYuanToZaiBill==null) {
            SubAccountYuan subAccountYuan = subAccountYuanDao.findByUserId(userId);
            //有鲸源账户
            if (subAccountYuan.getAmount().compareTo(BigDecimal.ZERO)>0) {
                ConfigVo configVo = configService.selectByCode(TransferConfig.yuan_to_zai.getCode());
                if (configVo==null || Strings.isNullOrEmpty(configVo.getConfigValue())) {
                    return new ResponseVo(ResponseCode.sys_exception_01);
                }
                BigDecimal num = new BigDecimal(configVo.getConfigValue());
                //计算兑换金额
                BigDecimal releaseNum = subAccountYuan.getAmount().multiply(num);
                resData.put("release_status",false);
                resData.put("release_num",releaseNum.setScale(2,BigDecimal.ROUND_DOWN));
            }
        }
        return ResponseVo.success().setData(resData);
    }

    /**
     * 领取当前释放的鲸源
     * 鲸源按比例释放成鲸仔，减少等量鲸源
     * 两位小数，抹零
     *
     * @return
     */
    @Override
    public ResponseVo addReleaseYuan() {
        String userId=WebUtils.getUser().getId();
        String currentDay = new DateTime().toString("yyyy-MM-dd");
        //查询是否已经领取过
        SubAccountYuanToZaiBill subAccountYuanToZaiBill = subAccountYuanToZaiBillDao.findByUserIdAndCurrentDay(userId,currentDay);
        Map<String,Object> resData = new HashMap<>(1);
        //默认已经领取过
        resData.put("release_num",0);
        if (subAccountYuanToZaiBill==null) {
            //判断用户是否拥有鲸源
            SubAccountYuan subAccountYuan = subAccountYuanDao.findByUserId(userId);
            BigDecimal preYuan = subAccountYuan.getAmount();
            if (preYuan.compareTo(BigDecimal.ZERO)>0) {
                //读取配置参数
                ConfigVo configVo = configService.selectByCode(TransferConfig.yuan_to_zai.getCode());
                if (configVo==null || Strings.isNullOrEmpty(configVo.getConfigValue())) {
                    return new ResponseVo(ResponseCode.sys_exception_01);
                }
                BigDecimal num = new BigDecimal(configVo.getConfigValue());
                //计算兑换金额
                BigDecimal releaseNum = preYuan.multiply(num).setScale(2,BigDecimal.ROUND_DOWN);

                //鲸源变动
                yuanToZaiHanler(subAccountYuan, releaseNum, currentDay);

                resData.put("release_num",releaseNum);
            }
        }
        return ResponseVo.success().setData(resData);
    }

    /**
     * 鲸源释放鲸仔，鲸源变动操作
     * @param subAccountYuan 鲸源账户
     * @param changeAmount 释放鲸源数量
     */
    private void yuanToZaiHanler(SubAccountYuan subAccountYuan, BigDecimal changeAmount, String currentDay) {
        String userId = subAccountYuan.getUserId();
        /**
         * 鲸源账户
         */
        BigDecimal preYuan = subAccountYuan.getAmount();
        subAccountYuan.setAmount(preYuan.subtract(changeAmount));
        subAccountYuanDao.update(subAccountYuan);
        /**
         * 鲸源转鲸仔流水
         */
        SubAccountYuanToZaiBill subAccountYuanToZaiBill = new SubAccountYuanToZaiBill();
        subAccountYuanToZaiBill.setUserId(userId);
        subAccountYuanToZaiBill.setAmount(changeAmount);
        subAccountYuanToZaiBill.setCurrentDay(currentDay);
        subAccountYuanToZaiBillDao.save(subAccountYuanToZaiBill);

        /**
         * 鲸源变动表
         */
        SubAccountYuanSeq subAccountYuanSeq = new SubAccountYuanSeq();
        subAccountYuanSeq.setUserId(userId);
        subAccountYuanSeq.setSeqFlagCode(SeqFlag.EXPEND.getCode());
        subAccountYuanSeq.setSeqFlagName(SeqFlag.EXPEND.getName());
        subAccountYuanSeq.setChangeTypeCode(YuanChangeType.TO_ZAI.getCode());
        subAccountYuanSeq.setChangeTypeName(YuanChangeType.TO_ZAI.getName());
        subAccountYuanSeq.setPreAmount(preYuan);
        subAccountYuanSeq.setAmount(subAccountYuan.getAmount());
        subAccountYuanSeq.setChangeAmount(changeAmount);
        subAccountYuanSeqDao.save(subAccountYuanSeq);
        /**
         * 总账户
         */
        SubAccount subAccount = subAccountDao.findByUserIdAndAccountTypeCode(userId, AccountType.JING_YUAN.getCode());
        subAccount.setAmount(subAccountYuan.getAmount());
        subAccountDao.update(subAccount);       

       
        /**
         * 鲸仔来源于鲸源流水
         */
        SubAccountZaiFromYuanBill subAccountZaiFromYuanBill = new SubAccountZaiFromYuanBill();
        subAccountZaiFromYuanBill.setUserId(userId);
        subAccountZaiFromYuanBill.setAmount(changeAmount);
        subAccountZaiFromYuanBillDao.save(subAccountZaiFromYuanBill);

        /**
         * 鲸仔账户
         */
        SubAccountZai subAccountZai = subAccountZaiDao.findByUserId(userId);
        BigDecimal preZaiAmount = subAccountZai.getAmount();
        subAccountZai.setUserId(userId);
        subAccountZai.setAmount(preZaiAmount.add(changeAmount));
        subAccountZaiDao.save(subAccountZai);

        SubAccountZaiSeq subAccountZaiSeq = new SubAccountZaiSeq();
        subAccountZaiSeq.setUserId(userId);
        subAccountZaiSeq.setSeqFlagCode(SeqFlag.INCOME.getCode());
        subAccountZaiSeq.setSeqFlagName(SeqFlag.INCOME.getName());
        subAccountZaiSeq.setChangeTypeCode(ZaiChangeType.FROM_YUAN.getCode());
        subAccountZaiSeq.setChangeTypeName(ZaiChangeType.FROM_YUAN.getName());
        subAccountZaiSeq.setPreAmount(preZaiAmount);
        subAccountZaiSeq.setAmount(subAccountZai.getAmount());
        subAccountZaiSeq.setChangeAmount(changeAmount);
        subAccountZaiSeqDao.save(subAccountZaiSeq);

        subAccount = subAccountDao.findByUserIdAndAccountTypeCode(userId, AccountType.JING_ZAI.getCode());
        subAccount.setAmount(subAccountZai.getAmount());
        subAccountDao.update(subAccount);

    }



}
